/**
 * WMS表格组件类型定义
 *
 * 定义表格相关的接口、类型和常量
 * 提供完整的表格功能类型支持
 */

import type {
  WmsBaseComponentProps,
  WmsLoadingProps,
  WmsEventHandlers,
} from "./common";

/**
 * 表格排序配置类型
 */
export interface WmsTableSortConfig {
  /** 排序字段 */
  prop: string;
  /** 排序方向 */
  order: "ascending" | "descending" | null;
}

/**
 * 表格筛选配置类型
 */
export interface WmsTableFilterConfig {
  /** 筛选字段 */
  prop: string;
  /** 筛选值 */
  value: any;
  /** 筛选条件 */
  condition?:
    | "eq"
    | "ne"
    | "gt"
    | "gte"
    | "lt"
    | "lte"
    | "like"
    | "in"
    | "between";
}

/**
 * 表格选择配置类型
 */
export interface WmsTableSelectionConfig {
  /** 是否支持多选 */
  multiple?: boolean;
  /** 选择项判断函数 */
  selectable?: (row: any, index: number) => boolean;
  /** 保留选择状态 */
  reserveSelection?: boolean;
  /** 选择变化回调 */
  onSelectionChange?: (selection: any[]) => void;
}

/**
 * 表格展开配置类型
 */
export interface WmsTableExpandConfig {
  /** 是否支持展开 */
  expandable?: boolean;
  /** 展开行判断函数 */
  expandRowKeys?: any[];
  /** 默认展开所有行 */
  defaultExpandAll?: boolean;
  /** 展开变化回调 */
  onExpandChange?: (row: any, expanded: boolean) => void;
}

/**
 * 表格汇总配置类型
 */
export interface WmsTableSummaryConfig {
  /** 是否显示汇总行 */
  showSummary?: boolean;
  /** 汇总文本 */
  sumText?: string;
  /** 汇总方法 */
  summaryMethod?: (param: { columns: any[]; data: any[] }) => string[];
}

/**
 * 表格虚拟滚动配置类型
 */
export interface WmsTableVirtualScrollConfig {
  /** 是否启用虚拟滚动 */
  enabled?: boolean;
  /** 行高 */
  itemHeight?: number;
  /** 缓冲行数 */
  buffer?: number;
  /** 预加载行数 */
  preload?: number;
}

/**
 * 表格导出配置类型
 */
export interface WmsTableExportConfig {
  /** 文件名 */
  filename?: string;
  /** 文件类型 */
  type?: "xlsx" | "csv" | "pdf";
  /** 是否导出表头 */
  header?: boolean;
  /** 导出字段 */
  fields?: string[];
  /** 数据处理函数 */
  formatter?: (data: any[]) => any[];
}

/**
 * 表格打印配置类型
 */
export interface WmsTablePrintConfig {
  /** 打印标题 */
  title?: string;
  /** 是否显示打印预览 */
  preview?: boolean;
  /** 纸张大小 */
  paperSize?: "A4" | "A3" | "Letter";
  /** 页面方向 */
  orientation?: "portrait" | "landscape";
  /** 页边距 */
  margin?: {
    top?: number;
    right?: number;
    bottom?: number;
    left?: number;
  };
}

/**
 * 表格列分组配置类型
 */
export interface WmsTableColumnGroup {
  /** 分组标题 */
  label: string;
  /** 子列 */
  children: WmsTableColumnConfig[];
  /** 对齐方式 */
  align?: "left" | "center" | "right";
  /** 表头样式类名 */
  headerClassName?: string;
}

/**
 * 表格列配置扩展类型
 */
export interface WmsTableColumnConfig {
  /** 列属性名 */
  prop: string;
  /** 列标题 */
  label: string;
  /** 列类型 */
  type?: "selection" | "index" | "expand" | "default";
  /** 列宽度 */
  width?: string | number;
  /** 最小列宽 */
  minWidth?: string | number;
  /** 列固定 */
  fixed?: boolean | "left" | "right";
  /** 对齐方式 */
  align?: "left" | "center" | "right";
  /** 表头对齐方式 */
  headerAlign?: "left" | "center" | "right";
  /** 是否可排序 */
  sortable?: boolean | "custom";
  /** 排序方法 */
  sortMethod?: (a: any, b: any) => number;
  /** 排序字段 */
  sortBy?: string | string[] | ((row: any, index: number) => string);
  /** 排序顺序 */
  sortOrders?: ("ascending" | "descending")[];
  /** 是否可筛选 */
  filterable?: boolean;
  /** 筛选选项 */
  filters?: Array<{ text: string; value: any }>;
  /** 筛选方法 */
  filterMethod?: (
    value: any,
    row: any,
    column: WmsTableColumnConfig,
  ) => boolean;
  /** 筛选弹出框的定位 */
  filterPlacement?: string;
  /** 是否可调整列宽 */
  resizable?: boolean;
  /** 是否显示溢出提示 */
  showOverflowTooltip?: boolean;
  /** 列样式类名 */
  className?: string;
  /** 表头样式类名 */
  labelClassName?: string;
  /** 格式化函数 */
  formatter?: (
    row: any,
    column: WmsTableColumnConfig,
    cellValue: any,
    index: number,
  ) => string;
  /** 自定义渲染函数 */
  render?: (
    h: any,
    scope: { row: any; column: WmsTableColumnConfig; $index: number },
  ) => any;
  /** 自定义插槽名称 */
  slot?: string;
  /** 表头插槽名称 */
  headerSlot?: string;
  /** 编辑配置 */
  editable?: WmsTableEditableConfig;
  /** 验证规则 */
  rules?: any[];
  /** 字典类型 */
  dictType?: string;
  /** 是否可见 */
  visible?: boolean;
  /** 列描述 */
  description?: string;
  /** 列分组 */
  group?: string;
  /** 列权限 */
  permission?: string | string[];
}

/**
 * 表格单元格编辑配置类型
 */
export interface WmsTableEditableConfig {
  /** 编辑类型 */
  type: "input" | "select" | "date" | "number" | "switch" | "custom";
  /** 编辑器配置 */
  config?: {
    /** 选项列表(select类型) */
    options?: Array<{ label: string; value: any }>;
    /** 日期格式(date类型) */
    format?: string;
    /** 数字精度(number类型) */
    precision?: number;
    /** 最小值(number类型) */
    min?: number;
    /** 最大值(number类型) */
    max?: number;
    /** 步长(number类型) */
    step?: number;
    /** 占位符 */
    placeholder?: string;
    /** 是否禁用 */
    disabled?: boolean | ((row: any, index: number) => boolean);
  };
  /** 验证规则 */
  rules?: any[];
  /** 编辑触发方式 */
  trigger?: "click" | "dblclick" | "manual";
  /** 编辑完成回调 */
  onEditComplete?: (value: any, row: any, column: WmsTableColumnConfig) => void;
}

/**
 * 表格行操作配置类型
 */
export interface WmsTableRowActionConfig {
  /** 操作类型 */
  type: string;
  /** 操作标题 */
  label: string;
  /** 图标 */
  icon?: string;
  /** 按钮类型 */
  buttonType?: "primary" | "success" | "warning" | "danger" | "info" | "text";
  /** 是否显示 */
  show?: boolean | ((row: any, index: number) => boolean);
  /** 是否禁用 */
  disabled?: boolean | ((row: any, index: number) => boolean);
  /** 权限控制 */
  permission?: string | string[];
  /** 确认配置 */
  confirm?: {
    title?: string;
    message: string;
    type?: "warning" | "info" | "success" | "error";
  };
  /** 操作回调 */
  handler?: (row: any, index: number) => void;
}

/**
 * 表格工具栏配置类型
 */
export interface WmsTableToolbarConfig {
  /** 是否显示工具栏 */
  show?: boolean;
  /** 工具栏标题 */
  title?: string;
  /** 左侧工具 */
  leftTools?: Array<{
    type: string;
    label: string;
    icon?: string;
    buttonType?: string;
    permission?: string | string[];
    handler?: () => void;
  }>;
  /** 右侧工具 */
  rightTools?: Array<{
    type: string;
    icon?: string;
    tooltip?: string;
    handler?: () => void;
  }>;
  /** 是否显示刷新按钮 */
  showRefresh?: boolean;
  /** 是否显示密度设置 */
  showDensity?: boolean;
  /** 是否显示列设置 */
  showColumnSetting?: boolean;
  /** 是否显示全屏 */
  showFullscreen?: boolean;
}

/**
 * 表格状态管理类型
 */
export interface WmsTableState {
  /** 当前选中行 */
  currentRow?: any;
  /** 选中的行 */
  selectedRows: any[];
  /** 展开的行 */
  expandedRows: any[];
  /** 排序状态 */
  sortConfig?: WmsTableSortConfig;
  /** 筛选状态 */
  filterConfigs: WmsTableFilterConfig[];
  /** 加载状态 */
  loading: boolean;
  /** 数据 */
  data: any[];
  /** 分页信息 */
  pagination: {
    current: number;
    pageSize: number;
    total: number;
  };
}

/**
 * 表格配置类型
 */
export interface WmsTableConfig extends WmsBaseComponentProps, WmsLoadingProps {
  /** 表格数据 */
  data: any[];
  /** 列配置 */
  columns: WmsTableColumnConfig[];
  /** 是否显示边框 */
  border?: boolean;
  /** 是否显示斑马纹 */
  stripe?: boolean;
  /** 表格大小 */
  size?: "large" | "default" | "small";
  /** 表格高度 */
  height?: string | number;
  /** 表格最大高度 */
  maxHeight?: string | number;
  /** 是否显示表头 */
  showHeader?: boolean;
  /** 是否高亮当前行 */
  highlightCurrentRow?: boolean;
  /** 行样式类名 */
  rowClassName?: string | ((row: any, index: number) => string);
  /** 行样式 */
  rowStyle?: any | ((row: any, index: number) => any);
  /** 单元格样式类名 */
  cellClassName?:
    | string
    | ((
        row: any,
        column: any,
        rowIndex: number,
        columnIndex: number,
      ) => string);
  /** 单元格样式 */
  cellStyle?:
    | any
    | ((row: any, column: any, rowIndex: number, columnIndex: number) => any);
  /** 表头行样式类名 */
  headerRowClassName?: string | ((row: any, index: number) => string);
  /** 表头行样式 */
  headerRowStyle?: any | ((row: any, index: number) => any);
  /** 表头单元格样式类名 */
  headerCellClassName?:
    | string
    | ((
        row: any,
        column: any,
        rowIndex: number,
        columnIndex: number,
      ) => string);
  /** 表头单元格样式 */
  headerCellStyle?:
    | any
    | ((row: any, column: any, rowIndex: number, columnIndex: number) => any);
  /** 空数据提示文本 */
  emptyText?: string;
  /** 是否懒加载 */
  lazy?: boolean;
  /** 加载子节点方法 */
  load?: (row: any, treeNode: any, resolve: (data: any[]) => void) => void;
  /** 树形结构配置 */
  treeProps?: {
    children?: string;
    hasChildren?: string;
  };
  /** 选择配置 */
  selection?: WmsTableSelectionConfig;
  /** 展开配置 */
  expand?: WmsTableExpandConfig;
  /** 汇总配置 */
  summary?: WmsTableSummaryConfig;
  /** 虚拟滚动配置 */
  virtualScroll?: WmsTableVirtualScrollConfig;
  /** 工具栏配置 */
  toolbar?: WmsTableToolbarConfig;
  /** 导出配置 */
  export?: WmsTableExportConfig;
  /** 打印配置 */
  print?: WmsTablePrintConfig;
  /** 事件处理器 */
  events?: {
    /** 行点击事件 */
    onRowClick?: (row: any, column: any, event: Event) => void;
    /** 行双击事件 */
    onRowDblclick?: (row: any, column: any, event: Event) => void;
    /** 行右键点击事件 */
    onRowContextmenu?: (row: any, column: any, event: Event) => void;
    /** 表头点击事件 */
    onHeaderClick?: (column: any, event: Event) => void;
    /** 表头右键点击事件 */
    onHeaderContextmenu?: (column: any, event: Event) => void;
    /** 排序变化事件 */
    onSortChange?: (sortConfig: WmsTableSortConfig) => void;
    /** 筛选变化事件 */
    onFilterChange?: (filters: Record<string, any>) => void;
    /** 当前行变化事件 */
    onCurrentChange?: (currentRow: any, oldCurrentRow: any) => void;
    /** 选择变化事件 */
    onSelectionChange?: (selection: any[]) => void;
    /** 全选事件 */
    onSelectAll?: (selection: any[]) => void;
    /** 展开变化事件 */
    onExpandChange?: (row: any, expanded: boolean) => void;
  };
}

/**
 * 表格实例方法类型
 */
export interface WmsTableMethods {
  /** 清空选择 */
  clearSelection: () => void;
  /** 切换行选择状态 */
  toggleRowSelection: (row: any, selected?: boolean) => void;
  /** 切换全选 */
  toggleAllSelection: () => void;
  /** 设置当前行 */
  setCurrentRow: (row: any) => void;
  /** 清空排序 */
  clearSort: () => void;
  /** 清空筛选 */
  clearFilter: (columnKeys?: string[]) => void;
  /** 重新布局 */
  doLayout: () => void;
  /** 手动排序 */
  sort: (prop: string, order: string) => void;
  /** 滚动到指定位置 */
  scrollTo: (options: { top?: number; left?: number }) => void;
  /** 设置滚动位置 */
  setScrollTop: (top: number) => void;
  /** 设置滚动位置 */
  setScrollLeft: (left: number) => void;
}

/**
 * 表格插槽类型
 */
export interface WmsTableSlots {
  /** 空数据插槽 */
  empty?: () => any;
  /** 表格前缀插槽 */
  prepend?: () => any;
  /** 表格后缀插槽 */
  append?: () => any;
  /** 展开行插槽 */
  expand?: (scope: { row: any; $index: number }) => any;
  /** 自定义列插槽 */
  [key: string]: ((scope: any) => any) | undefined;
}
